B09【动态IP地址】DHCP
前言
现在我们都知道了网络通信需要IP地址,那么回想下我们的日常生活,电脑、手机、智能家电等设备连接家庭网络时,似乎都没有配置过ip地址。
获得IP地址的途径主要有两个:
通过手工配置的方式,即静态IP地址配置。
这种方式适用于终端设备较少的场景,或者从网络管理及安全的角度考虑,对设备与IP地址的绑定关系存在严格要求的场景等。
另外,服务器、网络打印机等大多数网络设备通常有稳定的通信及控制需求,因此往往采用静态IP地址的方式进行配置。
通过DHCP来分配及管理IP地址。
在终端设备的数量较多,而且网络对IP地址没有严格管控需求的场景中,或者在诸如访客网络这样的频繁有匿名用户上、下线的场景中,DHCP是一个非常不错的选择,它可以极大限度地简化网络管理,满足通信需求。
DHCP (Dynamic Host Configuration Protocol,动态主机配置协议)是一种非常常见的技术,用于对设备的IP地址等信息进行自动分配和管理。
DHCP是一种采用客户端/服务器通信模式的网络协议。 服务器并不是严格意思上的物理设备,而是指应用服务程序,这个应用程序通常运行在路由器或者服务器上,(以免误会,本文采用DHCP Server的名称)
客户端指客户端程序,通常运行在终端设备上(电脑、手机等)。
DHCP工作原理
先决条件:DHCP Server需要先配置一个IP地址池,并且地址池中有空闲IP可用。
这时对于一台终端来说,其申请一个IP地址会有以下四个过程:
发现阶段-DHCP DISCOVER
PC1上的DHCP客户端会在网络上查找是否存在DHCP Server:
PC1发送一个数据帧,这是一个广播帧,同时数据帧内部的[ 数据内容 ]是IP报文,是一个广播报文。
也就是说数据帧的源地址为PC1自己的MAC地址,目的地址为FF-FF-FF-FF-FF-FF。
数据帧内承载的IP报文的源IP地址为0.0.0.0(任意地址,因为目前自己还没有IP地址),目的IP地址为255.255.255.255(广播地址)
基于以上两条,就能保证该数据包会被网络上所有设备接收。
之后,IP报文内承载着一个UDP报文,源端口68,目的端口为67,承载的数据内容为DHCP Discover,这是用来发送给DHCP server的。
若设备未启用DHCP Server,则它不会开启并监听67端口,因此收到目的端口为67的UDP报文,就会丢弃。
若设备启用了DHCP Server,则会开启并监听67端口,因此收到目的端口为67的UDP报文,就会开始处理。
提供阶段-DHCP OFFER
当DHCP Server收到了DHCP Discover信息后,就会回复DHCP Offer信息,以告知自己的存在。
该信息一样是封装在UDP报文中,只不过源目端口要调换一下,源端口为服务器的端口,也就是67;目的端口为客户端的68。
该UDP也是封装在IP广播报文中,再接着封装在广播帧中。
或许你会疑惑:在前一个阶段,也就是DHCP客户端去请求DHCP Server时,对于服务器来说,不是已经从中获取到了DHCP客户端的MAC地址了吗,完全可以在回复时使用单播数据帧。这主要是出于以下几方面的考虑:
DHCP是从BOOTP协议演变而来,保留了广播机制以兼容原有网络环境。
使用广播简化了协议的实现,减少了需要处理的特殊情况。
比如在跨子网的DHCP场景中,DHCP中继代理需要转发DHCP消息。广播使得这个过程更加简单和标准化。
由于DHCP操作相对不频繁,广播带来的额外网络开销通常是可以接受的
请求阶段-DHCP REQUEST
需要注意的一点是,PC1收到的DHCP Offer可能不止一个,因为网络上可能存在多个DHCP Server。
对于DHCP Server而言,作为分配IP的服务;它收到PC1的Discover后,会去检查自己是否有IP可分配,有IP可分配,就会保留该IP,然后发送Offer给PC1。
因此PC在此阶段要去选择接收哪一份Offer中的IP地址,并拒绝其他Offer以让其他DHCP Server可以释放掉准备给自己的IP地址。
一般来说,PC都是选择自己最先收到Offer。
对每个Offer都进行一次回复,这很麻烦,因此DHCP规定了PC直接使用广播报文回复,并且报文内携带有所选的DHCP Server的标识(称为ServerIdentifier)。
用图中的情况来说的话,PC1发送的带有DHCP Request信息的报文,表示PC1的DHCP客户端只愿意接受R1上的DHCP Server所给出的Offer。
如果网络中有其他DHCP Server,它们看到该报文就明白PC1拒绝了它们的Offer,因此可以释放掉准备给PC1的IP地址,留给其他设备用。
确认阶段-DHCP ACK
在确认阶段,R1 上的 DHCP Server 会向 PC 1 上的 DHCP客户端 发送一个 DHCPACK 消息。
值得注意的是,该信息虽然因为PC1还没正式拥有IP地址,所以目的ip地址依旧填写为255.255.255.255,是一个ip广播报文;
但该ip广播报文是封装到单播帧中,目的地址填写为PC1的MAC地址。
PC1上的DHCP客户端接收到R1上的DHCP Server发送的DHCP ACK消息后,就意味着PC1首次获得了DHCP Server分配给自己IP地址。
但PC1还不会马上使用这个IP地址,PC1会去发布一个免费ARP报文以确认该IP地址在网络上是否唯一。
确认唯一,没有IP冲突,PC1才正式使用该IP地址。
租期与续租
需要注意的是,DHCP Server给出的IP地址原则上所有权是DHCP Server的,相当于是租用给其他设备的。
如下是我当前电脑显示的信息:
已启用 DHCP: 是
IPv4 地址: 192.168.235.103
IPv4 子网掩码: 255.255.255.0
获得租约的时间: 2024年7月31日 14:02:06
租约过期的时间: 2024年7月31日 15:02:05
IPv4 默认网关: 192.168.235.91
IPv4 DHCP 服务器: 192.168.235.91
一般来说,DHCP Server给的IP地址,租期都是24小时,时长可人为的在DHCP Server处修改。
租约期内,DHCP客户端才能使用相应的IP地址。当租约期到期之后,DHCP客户端是不被允许继续使用这个IP地址的。
当然了,在租约期还没有到期的时候,DHCP客户端是可以申请续租这个IP地址的。
通过发布DHCP REQUEST报文的方式进行申请续租,如下图所示:
按照DHCP协议的规定,在默认情况下,T1时刻是租约期到了一半的,T2时刻则是租约期到了87.5%。
在T1时刻,,PC1上的DHCP客户端会 以单播方式向R1上的DHCP Server发送一个DHCP REQUEST消息,请求续租IP地址 (也就是请求重新开始租约期的计时)。如果在T2时刻之前,PC 1上的DHCP客户端收到 了回应的DHCP ACK消息,则说明续租已经成功。
如果直到T2时刻, PC1上的DHCP客户端都未收到回应的DHCP ACK消息,那么PC 1上的DHCP客户端会以广播方式发送一DHCP REQUEST消息,继续请求续租IP地址。如果在租约期到期之前,PC1上的DHCP客户端收到了回应的DHCPACK消息,则说明续租成功。
如果直到租约期到期时,PC1上的DHCP客户端仍未收到回应的DHCP ACK消息,那么PC1就必须停止使用原来的IP地址。
此时PC1只能重新从发现阶段开始来重新申请一个IP地址。
另外,如果任何一次请求续租,DHCP Server回复的是DHCP NACK,则表示取消授权,回收IP地址。
PC1需要立刻放弃当前所用IP地址,重新从发现阶段开始来重新申请一个IP地址。
客户端放弃IP
当客户端发现服务器分配给它的IP地址发生冲突时,会通过发送DHCP DECLINE报文来通知服务器,并且会重新向服务器申请地址。
当客户端在租期时间到之前,如果用户不想使用分配的IP地址并使用了相关设置,会触发DHCP客户端向DHCP Server发送DHCP RELEASE报文,通知DHCP Server释放IP地址的租期。
DHCP 中继
上一节中我们所描述的DHCP基本工作流程就会发现,DHCP客户端 总是以广播方式来发送DHCP DISCOVER消息和 DHCP REQUEST 消息的。
如果DHCP Server和 DHCP客户端 不在同一个二层网络(广播域)中,那么DHCP Server根本就不可能接收到这些DHCPDISCOVER消息和 DHCPREQUEST 消息。
因此,我们之前所描述的DHCP工作流程,只适合于DHCP Server 和 DHCP客户端位于同一个二层网络的场景。
如果一个公司的网络包含了多个二层网络,那么我们是不是必须在每个二层网络中都至少部署一个DHCP Server呢?
从理论上讲,这样做未尝不可。但实际上,这样做是没有必要的,也是很不经济的。
事实上,,DHCP协议除了定义了DHCP客户端和DHCP Server这两种角色之外,还定义了DHCP Relay Agent (DHCP中继代理)这种角色。
DHCP Relay Agent的基本作用就是专门在DHCP客户端和DHCP Server之间进行DHCP消息的中转。
如图所示,DHCP客户端利用DHCP Relay Agent来从DHCP Server那里获取IP地址等配置参数时;
DHCP客户端必须与DHCP Relay Agent位于同一个二层网络;
但 DHCP Server可以与DHCP Relay Agent位于同一个二层网络,也可以与DHCP Relay Agent位于不同的二层网络。
DHCP客户端与DHCP Relay Agent之间是以广播方式交换 DHCP消息的,但DHCP Relay Agent与DHCP Server之间是以单播方式交换DHCP消息的(这就意味着DHCP Relay Agent必须事先知道DHCP Server的IP地址)。
DHCP snooping
IP地址及默认网关地址、DNS服务器地址等配置信息对于一台终端设备而言是非常重要的。
在一个网络中,如果终端设备接入网络后,获取的IP地址或默认网关地址等信息有误,那么势必造成通信中断或业务受影响。
DHCP的工作机制导致该协议在工作的过程中可能存在漏洞,最典型的问题之一是非法DHCP Server接入网络后,可能导致大量DHCP客户端获取错误的IP地址信息从而无法正常连接网络。(也就是我们常说的私接小路由)
在交换机上部署DHCP Snooping即可解决上述问题。
DHCP Snooping的功能之一是确保DHCP客户端从可信任的DHCP服务器获取合法IP地址等信息。
在交换机上的相应VLAN中激活DHCP Snooping后,交换机的接口将存在两种角色:
- 信任接口:信任接口允许接收包括DHCP Offer、DHCP ACK、DHCP NACK等在内的DHCP Server应答报文。
- 非信任接口:非信任接口不会接收包括DHCP Offer、DHCP ACK、DHCP NACK等在内的DHCP Server应答报文。
DHCP Snooping除了以上描述的基本功能外,还支持攻击防范功能:防止DHCP Server拒绝服务攻击、DHCP报文泛洪攻击、仿冒DHCP报文攻击等。
其原理是:
开启DHCP Snooping功能,设备能够通过分析DHCP的报文交互过程,生成DHCP Snooping绑定表,绑定表项包括客户端的MAC地址、获取到的IP地址、与DHCP客户端连接的接口及该接口所属的VLAN(Virtual Local Area Network)等信息。
由于DHCP Snooping绑定表记录了DHCP客户端IP地址与MAC地址等参数的对应关系,故通过对报文与DHCP Snooping绑定表进行匹配检查,能够有效防范非法用户的攻击。
规划
DHCP请求报文是广播的,如果同一网段中存在多个Server(有中继场景时针对的是DHCP中继),客户端只接收第一个收到的DHCP OFFER报文,这样可能会导致最终分配的IP地址不是预期的DHCP Server分配的。
DHCP Server规划时需要注意:
- 合理规划VLAN,确保同一VLAN内仅有一台DHCP Server(有中继场景时针对的是DHCP中继)能收到此VLAN内客户端的DHCP请求。
- 在DHCP客户端的上层接入设备上配置DHCP Snooping功能,确保客户端能向正确的DHCP Server申请网络参数。
DHCP Server的地址池可以分为:
- 基于接口方式的地址池:在DHCP服务器与客户端相连的接口上配置IP地址,地址池是跟此接口地址所属同一网段的IP地址,且地址池中地址只能分配给此接口下的客户端。这种配置方式简单,仅适用于DHCP服务器与客户端在同一个网段的场景。
- 基于全局方式的地址池:在系统视图下创建指定网段的地址池,且地址池中地址可以分配给设备所有接口下的客户端。当DHCP服务器与客户端不在同一个网段时,需要部署DHCP中继。
根据客户端在线时间合理规划租期。默认情况下,IP地址的租期为24小时。
在客户端流动性较大,在线时间较短的场景中(如咖啡厅、网吧、机场等),需要规划较短的租期,否则,会因为客户端地址来不及释放而造成地址池中地址不够用。
地址池地址不够用,DHCP Server便不会分配IP地址,客户端则没有IP可用,因此表项为无法联网。(此时,客户机会采用169.254.xxx.xxx的地址)
曾经在仓库进行装机联网激活几十台PC就遇到过此故障,需要登录服务器后台手动释放已分配的IP地址。
在客户端流动性小,在线时间较长的场景中(如企业办公区等),需要规划较长的租期,否则,会因为客户端不停更新租期或地址而占用系统资源。(一般可不修改,保持默认的24小时)
配置
以下内容主要针对于使用路由器/交换机的配置,并不是使用专门的硬件服务器配置DHCP Server,有关内容之后会单独出一期Windows/Linux中配置DHCP Server的文章。
前提配置
- 执行命令system-view,进入系统视图。
- 执行命令dhcp enable,开启DHCP功能。默认情况下,DHCP功能处于关闭状态。
配置IP地址池
创建地址池
基于接口方式的地址池
事实上,此方式无需配置地址池,只要在接口上配置了IP地址,就会默认采用该ip地址的网段信息作为地址池。
基于全局方式的地址池:
- 执行命令system-view,进入系统视图。
- 执行命令ip pool ip-pool-name,创建全局地址池,同时进入全局地址池视图。配置的ip-pool-name作为标识不同地址池的名字。
- 执行命令network ip-address [ mask { mask | mask-length } ],配置全局地址池可动态分配的IP地址范围。
配置客户端的网关
默认情况下,不会在分配IP地址时一同修改客户端的网关。
- 基于接口方式:
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
- 执行命令dhcp server gateway-list ip-address,配置需要分配给DHCP Client的网关地址。
- 基于全局方式:
- 执行命令system-view,进入系统视图。
- 执行命令ip pool ip-pool-name,进入全局地址池视图。
- 执行命令gateway-list ip-address,配置DHCP Client的网关地址。
配置客户端的DNS
配置有两种方式,一是自动获取,二是静态指定。
自动获取要求作为DHCP服务器的设备同时作为上层网络的DHCP客户端,设备从远端DHCP服务器获取DNS等配置信息之后,通过地址池的import功能,将这些信息再分配给下行的客户端。
此方式需要配置启用上行接口执行命令ip address dhcp-alloc,开启DHCP Client功能。
例如,某公司的DHCP服务器希望将从运营商获取统一的DNS配置信息,分配给下行的客户端,此时可以选择自动获取方式。
基于接口方式:
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
配置地址池将自动获取的DNS配置信息分配给DHCP客户端:
执行命令dhcp server import all,配置地址池将自动获取的DNS配置信息分配给DHCP客户端。
配置地址池将静态指定的DNS配置信息分配给DHCP客户端:
- 执行命令dhcp server dns-list ip-address,为DHCP客户端指定DNS服务器的IP地址。每个地址池最多可以配置8个DNS服务器地址。
- 执行命令dhcp server domain-name domain-name,配置分配给DHCP客户端的DNS域名后缀。
基于全局的方式:
执行命令system-view,进入系统视图。
执行命令ip pool ip-pool-name,进入全局地址池视图。
配置地址池将自动获取的DNS配置信息分配给DHCP客户端:
执行命令import all,配置地址池将自动获取的DNS配置信息分配给DHCP客户端。
配置地址池将静态指定的DNS配置信息分配给DHCP客户端:
- 执行命令dns-list ip-address,配置DHCP客户端使用的DNS服务器的IP地址。每个地址池最多可以配置8个DNS服务器地址。
- 执行命令domain-name domain-name,配置为DHCP客户端分配的域名后缀。
修改地址池的分配IP范围
基于接口方式:
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
- 执行命令dhcp server ip-range start-ip-address end-ip-address,指定DHCP Server预分配给DHCP Client的IP地址范围。
- 执行命令dhcp server mask { mask | mask-length },指定DHCP Server预分配给DHCP Client的IP地址的子网掩码。
基于全局方式:
执行命令system-view,进入系统视图。
执行命令ip pool ip-pool-name,进入全局地址池视图。
执行命令section section-id start-address [ end-address ],配置全局地址池中的IP地址段。
IP地址池由一个或多个IP地址段组成,各个地址段内的IP地址不能有重叠。
section配置的范围必须在创建地址池的network范围内。
配置不参与自动分配的IP地址
基于接口方式:
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
执行命令dhcp server excluded-ip-address start-ip-address [ end-ip-address ],配置地址池中不参与自动分配的IP地址。
多次执行该命令,可以配置多个不参与自动分配的IP地址。
例如,将192.168.1.10配置为不参与自动分配的地址:
1
dhcp server excluded-ip-address 192.168.1.10
基于全局方式:
执行命令system-view,进入系统视图。
执行命令ip pool ip-pool-name,进入全局地址池视图。
执行命令excluded-ip-address start-ip-address [ end-ip-address ],配置地址池中不参与自动分配的IP地址。
多次执行该命令,可以配置多个不参与自动分配的IP地址。
例如,将192.168.1.10配置为不参与自动分配的地址:
1
excluded-ip-address 192.168.1.10
配置设备获取固定的指定IP地址
网络规划时,有些重要主机为了保证稳定性,需要使用固定的IP地址。(例如服务器、打印机)
一种方式就是设备使用静态IP地址,然后DHCP Server上配置不分配该IP地址。
另一种方式就是设备使用自动获取,然后DHCP Server上配置为该设备分配固定的IP地址。(此方式需要IP地址存在于地址池中)
实际要看场景使用哪种方式,一般来说配置第一种方式比较好。
但有时对一些容易被设置自动获取IP地址/设备无法设置静态IP时,就用第二种方式。
有一些打印机,尤其是不带显示屏的,容易在出故障时(卡纸等),被用户乱按导致恢复出厂设置,进而变成自动获取IP。
- 基于接口方式:
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
- 执行命令dhcp server static-bind ip-address ip-address mac-address mac-address [ description description ],配置为指定DHCP Client分配固定IP地址。可选添加描述。
- 基于全局方式:
- 执行命令system-view,进入系统视图。
- 执行命令ip pool ip-pool-name,进入全局地址池视图。
- 执行命令static-bind ip-address ip-address mac-address mac-address [ description description ],配置为指定DHCP Client分配固定IP地址。 可选添加描述。
修改地址租期
- 基于接口方式:
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
- 执行命令dhcp server lease { day day [ hour hour [ minute minute ] ] | unlimited },配置IP地址租期。
- 基于全局方式:
- 执行命令system-view,进入系统视图。
- 执行命令ip pool ip-pool-name,进入全局地址池视图。
- 执行命令lease { day day [ hour hour [ minute minute ] ] | unlimited },配置IP地址租期。
配置DHCP中继
在与终端设备相连的接口上配置启用DHCP中继功能
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number[.subinterface-number ],进入接口视图或子接口视图。
执行命令ip address ip-address { mask | mask-length },配置接口的IP地址。 (若已配置则跳过该步骤)
执行命令dhcp select relay,使能接口的DHCP中继功能。
(请确定是否开启了ARP功能,早期华为设备默认不开启,需使用arp broadcast命令用来启用接口的ARP广播功能)
执行命令dhcp relay server-ip ip-address,配置DHCP服务器的IP地址。每个接口下最多可配置8个DHCP服务器地址。
配置DHCP Snooping
执行命令system-view,进入系统视图。
执行命令dhcp enable,开启DHCP功能。
执行命令dhcp snooping enable,启用DHCP Snooping功能。
启用DHCP Snooping功能,可在接口视图、或VLAN视图下进行配置。
- 接口视图下:
执行命令interface interface-type interface-number,进入连接用户的接口视图。
执行命令dhcp snooping enable,启用接口下的DHCP Snooping功能。
在接口下执行该命令,则命令功能对该接口接收到的所有DHCP报文生效。
- VLAN视图下:
执行命令vlan vlan-id,进入VLAN视图。
执行命令dhcp snooping enable,启用VLAN下的DHCP Snooping功能。
在VLAN视图下执行此命令,则对设备所有接口接收到的属于该VLAN的DHCP报文命令功能生效。
配置接口为“信任”状态,可在接口视图、VLAN视图下执行。
- 接口视图下:
执行命令interface interface-type interface-number,进入连接用户的接口视图。
执行命令dhcp snooping trusted,配置接口为“信任”接口。
默认情况下,接口的状态为“非信任”状态。
- VLAN视图下:
执行命令vlan vlan-id,进入VLAN视图。
执行命令dhcp snooping trusted interface interface-type interface-number ,配置接口为“信任”接口。
默认情况下,接口的状态为“非信任”状态。
配置案例
基础配置与DHCP中继
R2上配置DHCP Server,为PC1、PC2、PC3为代表的区域分配不同网段的ip地址。
配置R2,创建3个地址池,分别是PC1用的192.168.1.0 /25;PC2用的192.168.1.128 /25;PC3用的172.12.12.0 /24。
先配置与PC3相关的测试一下。
1 | <Huawei>system-view |
测试,没问题(模拟器中,记得PC勾选DHCP获取地址,点击应用)
1 | PC3>ipconfig |
继续配置R2上的地址池:
1 | [R2]ip pool pc1 |
接下来配置R1:
1 | <Huawei>system-view |
进行测试。。会发现PC1跟PC2都获取不到IP,这很奇怪对吧?
但进行抓包,能看到,DHCP中继是成功的,R1会发生携带DHCP信息的报文给R2。
答案很简单,看图就知道了,R1是使用代理接口的IP地址单播一个数据包给R2。
因此对于R2来说,它需要会包给192.168.1.126和192.168.1.254。
而我们并没有给R2配置到达这两个网段的路由信息。
因此它不知道怎么回复,这也是抓包信息中,只有R1到R2的,没有R2到R1的原因。
所以我们给R2配置一条路由信息:(直接聚合成/24网段)
1 | [R2]ip route-static 192.168.1.0 24 172.12.12.1 |
配置完成之后,PC1、PC2就能获取地址了,既然开着抓包了,我们正好可以看到四个阶段的报文:
1 | PC1>ipconfig |
小知识:正因为R1采用与设备直连的接口IP去申请IP地址,才能根据源IP地址匹配合适的地址池,分配网段正确的IP地址给设备。
接口地址池与DHCP Snooping
保留上个案例的R2,我们改一下拓扑。
设定一下场景:除R2之外的,才是原本的网络结构。R2作为用户私自带来的无线WiFi路由器,接入了网络中。
介绍下原有配置:
1 | <Huawei>system-view |
1 | <Huawei>system-view |
PC3重新获取一下IP地址,可以看到获取的是10网段的ip,配置无误。
1 | PC3>ipconfig /renew |
这时,我们模拟用户私接小路由。
首先配置vlan接口:
1 | [SW2]interface g0/0/2 |
刷新一下PC3的ip,会发现随机出现了172网段的ip。
为此,我们就需要配置DHCP Snooping绑定DHCP Server所在的接口。
不要忘了执行dhcp enable
1 | <SW2>system-view |
这时,我们多刷新几次也都是10网段的ip了。
1 | PC>ipconfig /renew |